glitter makes SPARQL

glitter, un package R pour explorer et collecter des données du web sémantique

Lise Vaudor, Maëlle Salmon

Rencontres R 2023, Avignon

2024-09-06

Projet RECIT

Appel à projet de l’ENS de Lyon “Projets émergents” => 💰 20 000 euros sur 3 ans

Web sémantique, linked open data, web des données

© Camille Scheffler

Formalisation des Linked Open Data

© Camille Scheffler exemple: URI correspondant au film “Marius et Jeannette” sur Wikidata

Package glitter: objectifs

🎯 Promouvoir l’usage (exploration, recueil, analyse) des données du web sémantique pour les chercheur·se·s et étudiant·e·s usagers de R, en:

  • facilitant l’écriture des requêtes SPARQL
  • facilitant l’envoi des requêtes
  • favoriser l’analyse/valorisation ultérieure dans R

En tant que “Domain Specific Language” (DSL), glitter correspond à une syntaxe et des fonctions plus proches du tidyverse et base R que de SPARQL.

Linked Open Data: difficultés d’appropriation et de collecte

  • 👀 ce qu’on appréhende directement: le web documentaire
  • 💭 difficultés liées à la structure des données en graphes
  • 🔮 métadonnées intégrées aux données
  • 🧠️ transformation en données tabulaires pour analyse
  • ⛏️ difficultés de collecte (SPARQL)

Du graphe de connaissances au tableau de données

Exemple de requête simple

Dans R, sans glitter:

query='SELECT ?film ?filmLabel 
   WHERE { 
   ?film wdt:P31 wd:Q11424. 
   SERVICE wikibase:label{
      bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".}
   } 
   LIMIT 10' 
result=WikidataQueryServiceR::query_wikidata(query) 

Dans R, avec glitter:

tib <- spq_init() %>% 
spq_add("?film wdt:P31 wd:Q11424", .label="?film") %>%
spq_head(n=10) %>%
spq_perform()
  • 🖊️ Rédaction et envoi de commandes R
  • 🎁 Recueil du tableau de résultats en tant qu’objet R
  • 🎯 Chaîne de traitement reproductible
film filmLabel
http://www.wikidata.org/entity/Q372 We Live in Public
http://www.wikidata.org/entity/Q593 A Gang Story
http://www.wikidata.org/entity/Q595 The Intouchables
http://www.wikidata.org/entity/Q1365 Swept Away
http://www.wikidata.org/entity/Q2201 Kick-Ass
http://www.wikidata.org/entity/Q2345 12 Angry Men
http://www.wikidata.org/entity/Q2875 Gone with the Wind
http://www.wikidata.org/entity/Q3092 The Man Between
http://www.wikidata.org/entity/Q3187 Rough Night in Jericho
http://www.wikidata.org/entity/Q3208 Alien Raiders

Dimension de la requête?

Combien de films dans Wikidata:

tib <- spq_init() %>%                 # Initialise requête puis
  spq_add("?film wdt:P31 wd:Q11424",  # Ajoute motif "?film est une instance de film"
          .label="?film") %>%         # ... étiquette ?film puis
  spq_summarise(n_films=n()) %>%      # Résume en comptant le nombre de films puis
  spq_perform()                       # Envoie la requête
n_films
284098

Données enrichies pour produire une carte

lf_2=spq_init() %>%                     # Initialise requête puis
  spq_add("?film wdt:P31 wd:Q11424",    # Ajoute motif "?film est une instance de film"
          .label="?film") %>%           # ... étiquette ?film puis
  spq_add("?film wdt:P840 ?loc",        # Ajoute motif "?film a pour localisation narrative ?loc
          .label="?loc") %>%            # ... étiquette ?loc puis
  spq_add("?loc wdt:P625 ?coords") %>%  # Ajoute les coordonnées de ?loc puis
  spq_add("?film wdt:P3383 ?image") %>% # Ajoute l'affiche du film 
  spq_add("?film wdt:P921 ?subject",    # Ajoute ?subject
          .label="?subject",            # et l'étiquette associée
          .required=FALSE) %>%          # si dispo
  spq_add("?film wdt:P577 ?date") %>%   # Ajoute ?date (la date de sortie) puis
  spq_mutate(year=year(date)) %>%       # Ajoute variable year qui correspond à l'année de ?date puis
  spq_select(-date) %>%                 # Retire date des variables renvoyées 
  spq_language("fr,en") %>%             # Etiquette quand demandé de préférence en français, à défaut en anglais puis
  spq_perform()                         # Envoie la requête

Cette table comprend 2428 lignes (films avec localisation narrative, coordonnées associées et affiche). Voici les premières:

lf_2_show
filmLabel locLabel coords image subjectLabel year
Une femme cherche son destin Rio de Janeiro Point(-43.205555555 -22.911111111) http://commons.wikimedia.org/wiki/Special:FilePath/Now%2C%20Voyager%20%281942%20poster%29.jpg NA 1942
La Fièvre dans le sang Kansas Point(-98.0 38.5) http://commons.wikimedia.org/wiki/Special:FilePath/Splendor%20Sheet%20A.jpg NA 1961
La Fièvre dans le sang Kansas Point(-98.0 38.5) http://commons.wikimedia.org/wiki/Special:FilePath/Splendor%20Sheet%20A.jpg NA 1962
La Fièvre dans le sang Kansas Point(-98.0 38.5) http://commons.wikimedia.org/wiki/Special:FilePath/Splendor%20Sheet%20A.jpg NA 1964
La Foire aux illusions Iowa Point(-93.0 42.0) http://commons.wikimedia.org/wiki/Special:FilePath/State%20Fair%20%281933%20film%20poster%29%20-%20Restoration.jpg NA 1933
Viva Villa ! Mexique Point(-102.0 23.0) http://commons.wikimedia.org/wiki/Special:FilePath/Viva%20Villa%20poster.jpg Révolution mexicaine 1934

Carte mondiale des lieux de fiction

Package glitter: vue d’ensemble

Un package qui suit quelques principes du tidyverse…

  • usage du pipe %>%
  • fonctions à préfixe (ici spq_)
  • vise à la facilité d’utilisation (décomposition en étapes élémentaires)
  • évaluation tidy (référence directe aux noms de variables)
  • attention accordée à la documentation (par exemple via des vignettes)

Package glitter: fonctions principales

Fonctions de base:

  • spq_init() pour initier une requête
  • spq_add() pour rajouter un motif de triplet
  • spq_perform() pour envoyer la requête

Fonctions inspirées de dplyr :

  • spq_filter()
  • spq_select()
  • spq_arrange()
  • spq_mutate()
  • spq_group_by()
  • spq_summarise()

=> “Where the magic is” (Maëlle)

Généralisation à l’usage d’autres endpoints

Exemple de requête sur le SPARQL endpoint de dbpedia:

tib <- spq_init() %>%
  spq_add("?person dbo:birthPlace ?place") %>% # ?personne est née à ?place
  spq_add("?person dbo:profession ?job") %>%   # ?personne a pour profession ?job
  spq_add("?job rdfs:label ?jobLabel") %>%     # ?job a pour étiquette ?jobLabel
  spq_filter(lang(jobLabel)=="en") %>%         # Filtre pour ne garder que les étiquettes en anglais
  spq_add("?place rdfs:label 'Lyon'@en") %>%   # ?place a pour étiquette 'Lyon' (en anglais)
  spq_head(10) %>%
  spq_perform("dbpedia")                       # Envoie sur le SPARQL endpoint de DBPEDIA
person place job jobLabel
http://dbpedia.org/resource/Walter_Pilliet http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Resident_magistrate Resident magistrate
http://dbpedia.org/resource/Stefan_Meller http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Academician Academician
http://dbpedia.org/resource/André_Potocki http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Lawyer Lawyer
http://dbpedia.org/resource/François-Noël_Buffet http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Lawyer Lawyer
http://dbpedia.org/resource/Bernard_Cerquiglini http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Linguist Linguist
http://dbpedia.org/resource/Nora_Berra http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Physician Physician
http://dbpedia.org/resource/Bernard_Accoyer http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Physician Physician
http://dbpedia.org/resource/Jean-François_Mattei http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Physician Physician
http://dbpedia.org/resource/Delphine_Bagarry http://dbpedia.org/resource/Lyon http://dbpedia.org/resource/Physician Physician

Utiliser les LOD pour recueillir et compléter des données

Exemples pratiques d’utilisation:

  • 🌻 données botaniques => associer une photo et un nom vernaculaire à un nom d’espèce en latin
  • 📜 corpus de communiqués de presse du Ministère de l’Ecologie => récupérer le nom du ministre, avec les dates de début et de fin de son mandat.
  • 🏙️ lien entre grandes villes et plaines alluviales => récupérer les populations des grandes villes et leurs coordonnées, associer à une rivière
  • 🌍 carte du monde basée sur un shapefile avec des codes pays => récupérer les noms de pays, le nom et les coordonnées de leur capitales

=> Richesse thématique pour (par exemple) la construction de jeux de données pédagogiques

Et maintenant?

Chantier en cours!

📣 Retours utilisateurs bienvenus

Package installable et modifiable ici https://github.com/lvaudor/glitter.

🧠 Cas d’usages: à vous de jouer!

🙏 Merci pour votre attention!